package com.cskaoyan.javase.oop3._2inner._3local._4life;

/**
 * 在局部内部类当中访问作用域内部的局部变量
 * 该局部变量的取值不能修改是一个常量,根本原因在于:
 *      局部变量的生命周期和局部内部类对象的生命周期是冲突的。
 *
 *  为了解决这个生命周期的冲突
 *  Java是这么做的:
 *  所有在局部内部类成员方法中访问的作用域局部变量
 *  都作为自身对象的成员变量而存在了.
 *
 *  现在将原本是局部变量的一个变量变成了对象中的成员变量
 *  确实解决了生命周期的问题
 *  但也引入了新的问题:
 *  同步问题
 *
 *
 * @since 09:55
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        EnclosedClazz ec = new EnclosedClazz();
        IA ia = ec.test();
        ia.method();
    }
}

class EnclosedClazz {
    public IA test() {
        int a = 10;
        class Inner implements IA {
            @Override
            public void method() {
                System.out.println(a);
                /*
                    如果允许出现以下代码
                    那么从代码上来说,修改的是局部变量a的取值
                    但实际上我们都知道
                    在内存中,修改的是对象中的成员变量a的取值
                    这又出现了矛盾:
                    局部变量a的取值和成员变量a的取值需要同步修改
                    否者就会出现逻辑问题
                    所以这里有两个选择:
                        1.要么直接就不能改,就没有同步的问题
                        2.要么就老老实实做同步
                   总之Java的设计师没有选择同步,而是选择禁止修改,避免出现同步问题.
                 */
                // a = 100;
            }
        }
        new Inner().method();
        System.out.println(a);
        return new Inner();
    }
}

interface IA {
    void method();
}


